/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ve.usb.cep.actions;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.activation.*;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import ve.usb.cep.db.Session;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.HashMap;
import com.google.gson.Gson;
import java.util.ArrayList;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;

import ve.usb.cep.db.SelectObject;
import ve.usb.cep.db.domainObjects.Usuario;
import ve.usb.cep.db.models.UsuarioModel;
import ve.usb.cep.db.modelExceptions.UsuarioException;
import ve.usb.cep.util.sqlWhere;

import java.io.File;
import java.io.FileOutputStream;
/**
 *
 * @author Andras
 */
public class EnviarCorreoA extends ActionSupport{

    //Salida por texto
    protected String output;
    protected String error;
    private String titulo = "";
    private String recipientes = "";
    private String mensaje = "";
    private int enviarAUsuario = 0;
    private int usuarioSeleccionado = 0;
    
    private File file = null;
    private String contentType;
    private String filename;

    public void setUpload(File file) {
        this.file = file;
    }

    public void setUploadContentType(String contentType) {
        this.contentType = contentType;
    }

    public void setUploadFileName(String filename) {
        this.filename = filename;
    }


    @Override
    public String execute(){

        if (!"Administrador".equals(user().getRol())){
            error = "Sólo administradores pueden enviar correos";
            return ERROR;
        }
        if (enviarAUsuario == 0) {
            ActionContext.getContext().getSession().put("recipiente", "");
        } else {
            try{
                Connection conn = Session.connection();
                PreparedStatement pstmt;
                ResultSet rs;

                pstmt = conn.prepareStatement("select correo from usuario where codigo=?");
                pstmt.setInt(1,usuarioSeleccionado);
                rs = pstmt.executeQuery();
                rs.next();

                ActionContext.getContext().getSession().put("recipiente", rs.getString(1));
            }catch(java.sql.SQLException e){
                e.printStackTrace();
                return ERROR;
            }
        }
        return SUCCESS;
    }
    
    public InternetAddress[] recipientesToAddress(String recipientes) throws MessagingException
 {
        String[] aux = recipientes.split(" *, *| *; *");
        InternetAddress[] addressTo = new InternetAddress[aux.length];
        for (int i = 0; i < aux.length; i++) {
            addressTo[i] = new InternetAddress(aux[i]);
        }
        return addressTo;
    }
    
    public String enviar(){
        try {
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class",
                            "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465");

            javax.mail.Session session = javax.mail.Session.getInstance(props,
                    new javax.mail.Authenticator() {
                            protected PasswordAuthentication getPasswordAuthentication() {
                                    return new PasswordAuthentication("coordedp@gmail.com","coordEDPcoord");
                            }
                    });

                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("coordedp@gmail.com"));
                message.setRecipients(Message.RecipientType.TO, recipientesToAddress(this.recipientes));
                message.setSubject(this.titulo);
                
                Multipart multipart = new MimeMultipart();
                MimeBodyPart messageBodyPart = new MimeBodyPart();
                
                messageBodyPart.setText(this.mensaje);
                multipart.addBodyPart(messageBodyPart);
                
                if (this.file != null) {
                    messageBodyPart = new MimeBodyPart();
                    DataSource source = new FileDataSource(this.file.getAbsolutePath());
                    messageBodyPart.setDataHandler(new DataHandler(source));
                    messageBodyPart.setFileName(this.filename);
                    multipart.addBodyPart(messageBodyPart);
                }

                message.setContent(multipart);

                Transport.send(message);

        } catch (MessagingException e) {
            return ERROR;
        } catch (Exception e) {
            return ERROR;
        }
        return SUCCESS;
    }

    protected Usuario user(){

        Usuario u = (Usuario) ActionContext.getContext().getSession().get("user");
        if (null == u){
            u = new Usuario(0, "", "", "", 0, "Visitante", "", "", "", "");
        }
        return u;
    }
    
    public String getTitulo() {
        return this.titulo;
    }
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    
    public String getRecipientes() {
        return this.recipientes;
    }
    public void setRecipientes(String recipientes) {
        this.recipientes = recipientes;
    }
    
    public String getMensaje() {
        return this.mensaje;
    }
    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }
    
    public int getEnviarAUsuario() {
        return this.enviarAUsuario;
    }
    public void setEnviarAUsuario(int enviarAUsuario) {
        this.enviarAUsuario = enviarAUsuario;
    }
    
    public int getUsuarioSeleccionado() {
        return this.usuarioSeleccionado;
    }
    public void setUsuarioSeleccionado(int usuarioSeleccionado) {
        this.usuarioSeleccionado = usuarioSeleccionado;
    }

    //Output, salida estándar por texto
    public String getOutput() {
        return output;
    }

    public String getError(){
        return error;
    }
}